#ifndef __UNP_H
#define __UNP_H

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/wait.h>

#define MAXLINE         4096
#define SERV_PORT       9877

#define SA struct sockaddr

#define max(a,b) ((a)>(b) ? (a) : (b))
#define min(a,b) ((a)<(b) ? (a) : (b))

void err_quit(const char *fmt, ...);
void err_sys(const char *fmt, ...);

void print_hex(char* des, void* start, int length);

int Socket(int domain, int type, int protocol);
void Bind(int fd, struct sockaddr *sa, socklen_t salen);
void Listen(int fd, int backlog);
int Accept(int fd, struct sockaddr* sa, socklen_t* salenptr);
void Connect(int fd, struct sockaddr *sa, socklen_t salen);
ssize_t Send(int fd, void *buf, size_t buflen, int flags);
ssize_t Recv(int fd, void *buf, size_t buflen, int flags);
ssize_t Recvfrom(int fd, void *buf, size_t len, int flags, 
                 struct sockaddr *addr, socklen_t *fromlen);
void Sendto(int fd, void *buf, size_t len, int flags,
            struct sockaddr *addr, socklen_t tolen);
void Close(int fd);
void Getpeername(int fd, struct sockaddr *sa, socklen_t *salenptr);
void Getsockname(int fd, struct sockaddr *sa, socklen_t *salenptr);
ssize_t readline(int fd, void *vptr, size_t maxlen);
ssize_t Writen(int fd, const void* vptr, size_t n);
ssize_t Readn(int fd, void* vptr, size_t n);

void str_echo(int fd);
void str_cli(FILE *fp, int fd);

const char*Inet_ntop(int, const void *, char *, size_t);
void Inet_pton(int, const char *, void *);

void Fclose(FILE *fp);
FILE * Fdopen(int fd, const char *type);
char * Fgets(char *ptr, int n, FILE *stream);
FILE * Fopen(const char *filename, const char *mode);
void Fputs(const char *ptr, FILE *stream);

ssize_t Readline(int fd, void *vptr, size_t maxlen);

void dg_echo(int fd, struct sockaddr *cliaddr, socklen_t clilen);
void dg_cli(FILE *fp, int fd, struct sockaddr *servaddr, socklen_t servlen);
    
#endif

